import os
import re

def sort_files_by_date(directory, pattern_string):
    files = os.listdir(directory)
    pattern = re.compile(pattern_string)
    file_date_list = []
    for file in files:
        match = pattern.match(file)
        if match:
            file_date = match.group(1)
            file_date_list.append((directory + '/' + file, file_date))
    file_date_list.sort(key=lambda x: x[1])
    return file_date_list

def merge_and_sort_files(directories, patterns):
    """
    合并并排序多个目录中的文件。

    参数:
    directories (list): 目录路径列表。
    patterns (list): 用于匹配每个目录中文件的正则表达式模式列表。

    返回:
    list: 合并并排序后的文件列表。
    """
    # 初始化一个列表来存储每个目录中的排序文件
    sorted_files_list = []
    
    # 对每个目录中的文件按日期排序
    for directory, pattern in zip(directories, patterns):
        sorted_files = sort_files_by_date(directory, pattern)
        sorted_files_list.append(sorted_files)
    
    # 初始化合并后的文件列表
    merged_files = []
    
    # 初始化每个目录的文件索引
    indices = [0] * len(sorted_files_list)
    
    # 当至少有一个目录中还有文件时
    while any(index < len(sorted_files) for index, sorted_files in zip(indices, sorted_files_list)):
        # 找到当前日期最早的文件
        earliest_date = None
        earliest_file = None
        earliest_index = None
        
        for i, (sorted_files, index) in enumerate(zip(sorted_files_list, indices)):
            if index < len(sorted_files):
                file, date = sorted_files[index]
                if earliest_date is None or date < earliest_date:
                    earliest_date = date
                    earliest_file = file
                    earliest_index = i
        
        # 将最早的文件添加到合并列表中
        merged_files.append(earliest_file)
        
        # 移动到该目录中的下一个文件
        indices[earliest_index] += 1
    
    # 返回合并并排序后的文件列表
    return merged_files

# 示例用法
directories = ['./database/physical/patch', './database/logical/patch', './database/other/patch']
patterns = [r'patch_(\d{8})(_\d+)?\.sql', r'patch_init_(\d{8})(_\d+)?\.sql', r'patch_other_(\d{8})(_\d+)?\.sql']

merged_files = merge_and_sort_files(directories, patterns)
for file in merged_files:
    print(file)